package test;

import java.io.File;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;

//调用方法：在每个 class 中，都如下方法调用，但只创建了一次
//private static PropertiesConfiguration conf = Configurations.getInstance("h819.properties");

//依赖包查看官方网站

public class Configurations {

	// 使用一个变量来在全局中缓存曾经创建的实例
	private static PropertiesConfiguration config = null;

	/**
	 * 通过静态方法调用，避免初始化被初始化，隐藏该构造器
	 * 
	 * @param propertyFileName
	 */
	private Configurations() {

	}

	// 提供一个静态方法，用于返回Singleton实例
	/**
	 * 应用"单例模式" 保证只只创建一个一个 PropertiesConfiguration 对象
	 * 
	 * @param propertyFileName
	 *            属性文件名称,放置在 class 中
	 */
	public static PropertiesConfiguration getInstance(String propertyFileName) {
		if (config == null) {
			// 注意路径默认指向的是classpath的根目录
			try {
				config = new PropertiesConfiguration(propertyFileName);
				// 更改属性值后，自动保存
				config.setAutoSave(true);
			} catch (ConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return config;
	}

	public static PropertiesConfiguration getInstance(File propertyFileName) {
		if (config == null) {
			// 注意路径默认指向的是classpath的根目录
			try {
				config = new PropertiesConfiguration(propertyFileName);
				// 更改属性值后，自动保存
				config.setAutoSave(true);
			} catch (ConfigurationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return config;
	}

	/**
	 * 得到指定名称的属性的字符串值。属性值中不能有标点逗号 "," 如果确实需要逗号 "," ，则用转义字符分开即 "\,"
	 * 
	 * @param key
	 *            属性名称
	 * @return 属性的值
	 */
	public String getString(String key) {
		return config.getString(key);
	}

	/**
	 * 得到指定名称的属性的字符串值,为多值字符串,值之间用","分开 如 keys=Deur 3,Deur 4,Deur 5
	 * 
	 * @param key
	 *            属性名称
	 * @return 属性的值
	 */
	public String[] getStringArray(String key) {
		return config.getStringArray(key);
	}

	/**
	 * 
	 * @param key
	 * @return
	 */
	public int getInt(String key) {
		return config.getInt(key);
	}

	public float getFloat(String key) {
		return config.getFloat(key);
	}

	/**
	 * 
	 * @param key
	 * @return
	 */
	public double getDouble(String key) {
		return config.getDouble(key);
	}

	/**
	 * 更改属性值
	 * 
	 * @param key
	 * @param value
	 */
	public void setProperty(String key, Object value) {
		config.setProperty(key, value);
	}

	private void example() {

		//PropertiesConfiguration conf1 = Configurations.getInstance("h819.properties");
		
		PropertiesConfiguration conf2 = Configurations.getInstance(new File(
				"d:\\work.properties"));

		// System.out.println("com.test.id :" + conf.getFloat("com.test.id"));
		// System.out.println("com.test.st :" + conf.getString("com.test.st"));

		System.out.println("jdbc.oracle.work.235.url :"
				+ conf2.getString("jdbc.oracle.work.235.url"));

		// conf.setProperty("com.test.id", Double.valueOf("456"));
		//conf2.setProperty("jdbc.oracle.work.235.url", String.valueOf("world"));
		System.out.println("jdbc.oracle.work.235.url :" + conf2.getString("jdbc.oracle.work.235.url"));

	}

	public static void main(String[] args) {

		Configurations s = new Configurations();
		s.example();
	}

}
